﻿using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace TT.Runtime
{
    public class Instruction
    {
        public OPCode code
        {
            get
            {
                var b = dataarea[0];
                return (OPCode)(b & 0x1f);
            }
            set
            {
                if ((byte)value >= 32)
                    throw new Exception("error range.");
                dataarea[0] = (byte)((byte)value + ((size / 4 - 1) << 5));
            }
        }
        public int size
        {
            get
            {
                var b = dataarea[0];
                return 4 * (((b & 0xe0) >> 5) + 1);
            }
            set
            {
                if (value > 32 || (value % 4) != 0)
                {
                    throw new Exception("error range");
                }
                dataarea[0] = (byte)((byte)code + ((value / 4 - 1) << 5));
            }
        }
        public byte extParam;
        public byte[] dataarea = new byte[32];//最大32字节数据
        public int FromStream(byte[] data, int offset)
        {
            //填充第0字节
            dataarea[0] = data[offset];
            //然后size就可以用了，因为size是从0字节取得
            for (var i = 1; i < size; i++)
            {
                dataarea[i] = data[i + offset];
            }
            return offset + size;
        }
        public int ToStream(byte[] data,int offset)
        {
            for (var i = 0; i < size; i++)
            {
                data[i+ offset] = dataarea[i];
            }
            return offset + size;
        }
    }
    //[StructLayout(LayoutKind.Explicit, Size = 4)]
    //public struct Instruction
    //{
    //    //5bit指令族 + 3bit指令数据长度 0~7  4~32字节长度指令
    //    //5指令族 + 8指令选项 //8182种组合每个族256个组合
    //    //+ 1 + 3指令长度
    //    //前4bit是指令族 然后8bit各种指令选项 最后4bit 是 预留指令选项  
    //    [FieldOffset(0)]
    //    public UInt16 fullcode;//根据完整的指令跳转会比较方便 

    //    public OPCode getcode()
    //    {
    //        return (OPCode)(fullcode & 0x1f);
    //    }
    //    public int getCodeLen()
    //    {
    //        return 4 * ((fullcode & 0xe0) >> 3) + 1;
    //    }
    //    [FieldOffset(1)]
    //    public byte opext;//第二个字节是指令扩展

    //    [FieldOffset(2)]
    //    public byte r1;
    //    [FieldOffset(3)]
    //    public byte r2;

    //    [FieldOffset(2)]
    //    public UInt16 data;
    //}
}
